Skip to content

Payments

Telegram has now supported payments for your mini-apps. To start receiving payments, we need to have a payment provider.

Payment Provider

Enabling Payments

Enabling Payments

  • Use the /mybots command in the chat with BotFather and choose the @merchantbot that will be offering goods or services.
  • Go to Bot Settings > Payments.
  • Choose a provider, and you will be redirected to the relevant bot.
  • Enter the required details so that the payments provider is connected successfully, go back to the chat with Botfather.
  • The message will now show available providers. Each will have a name, a token, and the date the provider was connected.
  • You will use the token when working with the Bot API.

Set the token for the client;

You may store your provider token in your environmental variables. See Client.initialize.

js
Client.invoices.setToken('<provider_token>')
js
Client.intialize('<token>', '<provider_token>')

Accepting Payments

To accept payments, you can follow this step-by-step guide;

Sending an invoice

tgx-core offers multiple methods to send an invoice to your target chats and users.

js
chat.send(MessagePayloadMethod.Invoice, {
    invoice: new Invoice(...)
})

Shipping

For flexible invoices, where you send physical products requiring adress and offer multiple or dynamic shipping options.

If you offer flexible shipping options and have set is_flexible to true when sending your invoice. Your client will emit a ClientEvent.ShippingQuery event.

ts
Client.on(ClientEvent.ShippingQuery, ( shipping ) => {
    return shipping.ok(new ShippingOptions(
        ShippingOption('shipping_option_1', 'Shipping Option 1',
            new LabeledPrices()
                .add('Base Fee', '360') // $3.60
                .add('Tax', '110') // $1.10, hence the total would be 4.70
        )
    ))
})
js
Client.on(ClientEvent.ShippingQuery, ( shipping ) => {
    return shipping.notOk('We do not deliver to your state or country.')
})

PreCheckout

For finalization, you can put your code for final checking. This step is crucial in the process of the payment; before the ClientEvent.SuccesfulPayment, a ClientEvent.PreCheckoutQuery is received. Similarly to accepting shipping, you send an ok or not Ok.

js
Client.on(ClientEvent.PreCheckoutQuery, ( precheckout ) => {
    return precheckout.ok()
})
js
Client.on(ClientEvent.PreCheckoutQuery, ( precheckout ) => {
    return precheckout.notOk('The bot is currently not accepting orders.')
})

Successful Payment

It is your responsibility on how to handle successfult payments, so is storing the invoices for future disputes. When sending an invoice thus the user has paid, it will be transformed into a receipt.

ts
Client.on(ClientEvent.SuccessfulPayment, ( succesfulPayment ) => {
    // -- Your code here --
})

Reference

The information was provided by the Telegram's bot API documentation;
Payments Step-by-step.

Reference

The information was provided by the Telegram's bot API documentation; TelegramAPI#connecting-payments.

A modern, powerful library for building your Telegram bots, with seamless support for both JavaScript and Typescript.